#pragma once

// ....................................................................................................................
// Trieda IString
// ....................................................................................................................
class IString {
public:
	PCHAR Value; // Aktualny obsah
	INT32 Capacity; // Kapacita pamate
	INT32 Length; // Aktualna dlzka obsahu
	PVOID UserData; // Uzivatelsky udaj
public:
	IString(void); // Konstruktor
	IString(CONST_PCHAR pValue); // Konstruktor
	IString(CONST_PCHAR pValue, INT32 pLength); // Konstruktor
	IString(IString* pValue); // Konstruktor
	IString(IString& pValue); // Konstruktor
	IString(INT32 pValue); // Konstruktor
	IString(UINT32 pValue); // Konstruktor
	IString(INT64 pValue); // Konstruktor
	IString(UINT64 pValue); // Konstruktor
	IString(DOUBLE pValue); // Konstruktor
	IString(CONST_PWCHAR pValue); // Konstruktor
	IString(CONST_PWCHAR pValue, INT32 pLength); // Konstruktor
	~IString(void); // Destruktor
public:
	void __fastcall Clear(void); // Uvolnenie objektu z pamate
	void __fastcall Truncate(INT32 pLength = 0); // Skratenie obsahu
	void __fastcall Allocate(INT32 pCapacity, bool pCopy = false); // Alokacia pamate podla potreby
	INT32 __fastcall Compare(CONST_PCHAR pValue, INT32 pStart = 0, INT32 pLength = -1); // Porovnanie obsahu
	INT32 __fastcall Compare(IString* pValue); // Porovnanie obsahu
	INT32 __fastcall Compare(IString& pValue); // Porovnanie obsahu
	INT32 __fastcall CaseCompare(CONST_PCHAR pValue, INT32 pStart = 0, INT32 pLength = -1); // Porovnanie obsahu bez ohladu na velkost pismen
	INT32 __fastcall CaseCompare(IString* pValue); // Porovnanie obsahu bez ohladu na velkost pismen
	INT32 __fastcall CaseCompare(IString& pValue); // Porovnanie obsahu bez ohladu na velkost pismen
	INT32 __fastcall FindChar(CHAR pValue, INT32 pStart = 0); // Hladanie prveho vyskytu znaku
	INT32 __fastcall ReverseFindChar(CHAR pValue, INT32 pStart = -1); // Hladanie prveho vyskytu znaku reverznym smerom
	INT32 __fastcall Find(CONST_PCHAR pValue, INT32 pStart = 0); // Hladanie prveho vyskytu retazca
	INT32 __fastcall ReverseFind(CONST_PCHAR pValue, INT32 pStart = -1); // Hladanie prveho vyskytu retazca reverznym smerom
	void __fastcall Substring(INT32 pStart, INT32 pLength, IString *Result); // Extrahovanie podretazca
	void __fastcall LeftSubstring(INT32 pLength, IString *Result); // Extrahovanie podretazca zlava
	void __fastcall RightSubstring(INT32 pStart, IString *Result); // Extrahovanie podretazca zprava
	void __fastcall Append(CONST_PCHAR pValue, INT32 pLength); // Pripojenie hodnoty
	void __fastcall Append(CONST_PCHAR pValue); // Pripojenie hodnoty
	void __fastcall Append(IString* pValue); // Pripojenie hodnoty
	void __fastcall Append(IString& pValue); // Pripojenie hodnoty
	void __fastcall AppendChar(CHAR pValue); // Pripojenie znaku
public:
	void Format(char *pFormatStr, ...); // Sformatovanie retazca
	void AppendFormat(char *pFormatStr, ...); // Pripojenie sformatovaneho retazca
	void __fastcall EncodeStr(IString *Result); // Zakodovanie retazca pomocou Base64
	void __fastcall DecodeStr(IString *Result); // Dekodovanie retazca pomocou Base64
	void __fastcall LeftTrim(void); // Odstranenie prazdnych znakov zlava
	void __fastcall RightTrim(void); // Odstranenie prazdnych znakov zprava
	void __fastcall Trim(void); // Odstranenie prazdnych znakov zlava aj zprava
	void __fastcall ToLowercase(void); // Transformacia na lowercase
	void __fastcall SerializeData(PBYTE pData, INT32 pLength); // Serializacia dat do retazca
	INT32 __fastcall DeserializeData(INT32 pMaxLength, PBYTE Result); // Deserializacia dat z retazca
public:
	bool __fastcall IsCharacter(INT32 pIndex); // Test ci je char na zadanej pozicii znakom
	void __fastcall AppendUniqueChar(CHAR pValue); // Pripojenie znaku na koniec pokial tam nie je
	void __fastcall DeleteLastChar(CHAR pValue); // Zmazanie znaku z konca ak sa rovna zadanemu
	void __fastcall DeleteLastChar(void); // Zmazanie znaku z konca
	bool __fastcall SaveToTextFile(CONST_PCHAR pFileName); // Ulozenie obsahu do suboru
	bool __fastcall LoadFromTextFile(CONST_PCHAR pFileName); // Nacitanie obsahu zo suboru
	void __fastcall ReplaceStr(CONST_PCHAR pFind, CONST_PCHAR pReplace); // Nahradenie vyskytu podretazcov inymi
	void __fastcall CreateBounded(CHAR pLeftBound, CHAR pRightBound, CONST_PCHAR pValue, bool pUseBounds = true); // Vytvorenie ohraniceneho retazca
	void __fastcall ReplaceChar(CHAR pOld, CHAR pNew); // Nahradenie vsetkych vyskytov znaku
	bool __fastcall StartsWith(CONST_PCHAR pValue); // Test zaciatku retazca na zadanu hodnotu
	void __fastcall DeleteSubstring(INT32 pStart, INT32 pLength); // Vymazanie casti retazca
	bool __fastcall ReadLineFromFile(PVOID pFile); // Nacitanie riadku z textoveho suboru
public:
	void __fastcall ToUTF8(void); // Prevod aktualneho obsahu na UTF8 kodovanie
public:
	void __fastcall SetValue(CONST_PCHAR pValue); // Ulozenie hodnoty
	void __fastcall SetValue(CONST_PCHAR pValue, INT32 pLength); // Ulozenie hodnoty
	void __fastcall SetValue(IString* pValue); // Ulozenie hodnoty
	void __fastcall SetValue(IString& pValue); // Ulozenie hodnoty
	void __fastcall SetValue(INT32 pValue); // Ulozenie hodnoty
	void __fastcall SetValue(UINT32 pValue); // Ulozenie hodnoty
	void __fastcall SetValue(INT64 pValue); // Ulozenie hodnoty
	void __fastcall SetValue(UINT64 pValue); // Ulozenie hodnoty
	void __fastcall SetValue(DOUBLE pValue); // Ulozenie hodnoty
	void __fastcall SetValue(CONST_PWCHAR pValue); // Ulozenie hodnoty
	void __fastcall SetValue(CONST_PWCHAR pValue, INT32 pLength); // Ulozenie hodnoty
	void __fastcall SetValue(GUID *pValue); // Ulozenie hodnoty
public:
	IString& __fastcall operator = (CONST_PCHAR pValue); // Operator =
	IString& __fastcall operator = (IString* pValue); // Operator =
	IString& __fastcall operator = (IString& pValue); // Operator =
	IString& __fastcall operator = (INT32 pValue); // Operator =
	IString& __fastcall operator = (UINT32 pValue); // Operator =
	IString& __fastcall operator = (INT64 pValue); // Operator =
	IString& __fastcall operator = (UINT64 pValue); // Operator =
	IString& __fastcall operator = (DOUBLE pValue); // Operator =
	IString& __fastcall operator = (CONST_PWCHAR pValue); // Operator =
	bool __fastcall operator == (CONST_PCHAR pValue); // Operator ==
	bool __fastcall operator == (IString* pValue); // Operator ==
	bool __fastcall operator == (IString& pValue); // Operator ==
	bool __fastcall operator != (CONST_PCHAR pValue); // Operator ==
	bool __fastcall operator != (IString* pValue); // Operator ==
	bool __fastcall operator != (IString& pValue); // Operator ==
	IString& __fastcall operator += (CONST_PCHAR pValue); // Operator +=
	IString& __fastcall operator += (IString* pValue); // Operator +=
	IString& __fastcall operator += (IString& pValue); // Operator +=
	IString& __fastcall operator += (CHAR pValue); // Operator +=
public:
	PCHAR __fastcall PChar(void); // Ziskanie hodnoty ako char*
	PWCHAR __fastcall PWChar(void); // Ziskanie hodnoty ako wchar_t*
public:
	static INT32 __fastcall Str2Int32(CONST_PCHAR pValue, INT32 pStart = 0, INT32 pLength = -1); // Prevod retazca na int32
	static UINT32 __fastcall Str2UInt32(CONST_PCHAR pValue); // Prevod retazca na uint32
	static INT64 __fastcall Str2Int64(CONST_PCHAR pValue); // Prevod retazca na int64
	static UINT64 __fastcall Str2UInt64(CONST_PCHAR pValue); // Prevod retazca na uint64
	static DOUBLE __fastcall Str2Double(CONST_PCHAR pValue); // Prevod retazca na double
	static bool __fastcall Str2FILETIME(CONST_PCHAR pValue, PFILETIME Result); // Prevod retazca na FILETIME
	static bool __fastcall Str2SYSTEMTIME(CONST_PCHAR pValue, PSYSTEMTIME Result); // Prevod retazca na SYSTEMTIME
	static void __fastcall Int32ToStr(INT32 pValue, PCHAR Result, CHAR pThousandSeparator = 0); // Prevod int32 na retazec
	static void __fastcall UInt32ToStr(UINT32 pValue, PCHAR Result, CHAR pThousandSeparator = 0); // Prevod uint32 na retazec
	static void __fastcall Int64ToStr(INT64 pValue, PCHAR Result, CHAR pThousandSeparator = 0); // Prevod int64 na retazec
	static void __fastcall UInt64ToStr(UINT64 pValue, PCHAR Result, CHAR pThousandSeparator = 0); // Prevod uint64 na retazec
	static void __fastcall DoubleToStr(DOUBLE pValue, PCHAR Result, CHAR pThousandSeparator = 0); // Prevod double na retazec
	static void __fastcall HexToStr(UINT32 pValue, PCHAR Result, INT32 pNumsCount = 8); // Prevod uint32 na hex retazec
	static void __fastcall GetSubstring(INT32 pIndex, CONST_PCHAR pValue, CHAR pSeparator, IString *Result); // Ziskanie retazca zo zoznamu oddelenych oddelovacom
	static void __fastcall GetParamValue(CONST_PCHAR pValue, CONST_PCHAR pName, CHAR pLineSeparator, CHAR pValueSeparator, IString *Result); // Extrahovanie hodnoty parametra
	static void __fastcall FileTimeToStr(UINT32 pHighPart, UINT32 pLowPart, IString *Result); // Prevod FILETIME na retazec
	static void __fastcall FileTimeToStr(PFILETIME pValue, IString *Result); // Prevod FILETIME na retazec
	static bool __fastcall WildcardTest(CONST_PCHAR pValue, CONST_PCHAR pWildcard, CHAR pSeparator = ';'); // Vykonanie wildcard testu
	static bool __fastcall WildcardsTest(CONST_PCHAR pValue, CONST_PCHAR pWildcards, CHAR pSeparator = ';'); // Vykonanie multi wildcard testu
	static void __fastcall LowerCaseCopy(CONST_PCHAR pSource, PCHAR pDestination); // Vytvorenie lowercase kopie
	static bool __fastcall IsValidINT32(CONST_PCHAR pValue, bool pCanBeNegative = true); // Test platneho obsahu ako int32
	static bool __fastcall IsValidINT64(CONST_PCHAR pValue, bool pCanBeNegative = true); // Test platneho obsahu ako int64
	static bool __fastcall IsValidUINT32(CONST_PCHAR pValue); // Test platneho obsahu ako uint32
	static bool __fastcall IsValidUINT64(CONST_PCHAR pValue); // Test platneho obsahu ako uint64
	static void __fastcall ChooseLangNumberText(INT32 pValue, CONST_PCHAR pTexts, CHAR pSeparator, IString *Result); // Vyber jazykoveho popisu cisla
	static CHAR __fastcall ToUpperChar(CHAR pValue); // Prevod znaku na velke pismeno
	static CHAR __fastcall ToLowerChar(CHAR pValue); // Prevod znaku na male pismeno
	static bool __fastcall SubStringTest(CONST_PCHAR pValue, CONST_PCHAR pFindStr); // Test vyskytu podretazca bez ohladu na velkost pismen
	static bool __fastcall Octed2UINT64(CONST_PCHAR pString, INT32 pCharsCount, UINT64 &Result); // Prevod octed retazca na UINT64
};
// ....................................................................................................................
